Array.prototype.Myfilter = function (callback, thisArg) {
    // thisArg 执行 callback 时，用于 this 的值。
    console.log(this)
    if (this == undefined) { // this是调用的Array，如果没有直接报错
        throw new TypeError('this is null or not undefined');
    }
    if (typeof callback !== 'function') { // 如果回调不是函数报错
        throw new TypeError(callback + 'is not a function')
    }
    const res = [];  // res 保存的是满足回调函数的数组

    // 打印O也就是array,严谨性
    const O = Object(this); //this也就是Array，将Array对象化

    // >>>0 保证len为number，且为正数
    // const len = O.length >>> 0;
    const len = O.length;
    console.log(thisArg, "----------------------");
    // 循环遍历len,遍历循环满足条件的数
    for (let i = 0; i < len; i++) {
        if (i in O) {  // 如果i是O数组索引存在，防止越界
            // 通过回调函数调用传参,thisArg可以指定callback的this，如果只是当前操作this指针并不影响
            if (callback.call(thisArg, O[i], i, O)) {  //借用call，将当前值传给callback函数,不能中途return
                res.push(O[i]);
            }
        }
    }
    return res;
}


const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.Myfilter(word => word.length > 6);
console.log(result);
